先說明一下
我用輕前端 Vue 的目的,不是把整個網站都改用輕前端,而是為了把複雜的 js 取值、給值的邏輯交由 Vue Model Binding 的機制處理,進而省下語法 !
在 Vue 這個部份來說,我還在學習中,所以文章內容不會提到該怎麼寫 Vue,但我會使用 Composition API
另外,debug 時,記得持續開啟 chrome DevTools,看看 console 是否會報錯 !
Controller 內的
Get Action :
為了讓 Vue 起始能 Binding 成功,進入 Get 頁面時,一併給定 ViewModel 預設值 !
[HttpGet]
public IActionResult Case01()
{
    return View(new ViewModel());
}
Post Action :
只要是 ajax 所指定的 Action,該 Action 的 Route 都會改為 api 開頭
ajax Action 的部份,因為需要改成 json 格式,所以從原本的 FromForm 改成 FromBody
[HttpPost, Route("api/[controller]/[action]")]
public IActionResult PostCase01([FromBody]ViewModel vm)
{
    return Ok(vm);
}
View :
改用輕前端,等於前後端分離,所以前端欄位名稱都要手動給定 !
我會切開 C# 與 js / vue 的 coding style
Razor 的語法的影響限制
因為 Vue 的 Model Binding 是針對 js object,所以 ajax request content type 全部改為 json 格式
js 套件的引用,我統一放在 _Layout.cshtml 中
新增 JsonHelper,提供 ToJson() Extension Method !
public static class JsonHelper
{
    public static string ToJson<T>(this T t, bool isCamelCase = true)
    {
        var jsonSerializerOptions = new JsonSerializerOptions();
        if (isCamelCase)
        {
            jsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        }
        return JsonSerializer.Serialize(t, jsonSerializerOptions);
    }
}
內容
<div id="app" v-cloak>
    <form autocomplete="off"
          v-on:submit.prevent="submit_form">
        <p>
            <label for="id">編號:</label>
            <input type="number"
                   step="1"
                   min="0"
                   id="id"
                   v-model.number="vue_model.id" />
        </p>
        <p>
            <label for="name">姓名:</label>
            <input type="text"
                   id="name"
                   v-model="vue_model.name" />
        </p>
        <p>
            <button type="submit">送出</button>
        </p>
    </form>
    <p>
        <a v-bind:href="prev_url">回上一層</a>
    </p>
</div>
@section Scripts
{
    <script>
        const app = createApp({
            setup(){
                const post_url = '@Url.Action("PostCase01")';
                const prev_url = '@Url.Action("Index")';
                const vue_model = ref(@Html.Raw(Model.ToJson()));
                const submit_form = function() {
                    fetch(post_url, {
                        method: 'POST',
                        headers: {
                            'Content-Type': 'application/json',
                        },
                        body: JSON.stringify(vue_model.value),
                    })
                    .then(response => response.json())
                    .then(data => {
                        vue_model.value = data;
                    });
                }
                return {
                    post_url,
                    prev_url,
                    vue_model,
                    submit_form,
                }
            }
        });
        const vm = app.mount('#app');
    </script>
}
執行網站後,可以看出 ajax 打回後端,取回時,直接把資料放回 js object 就好 !
換句話說,不需要從 html 把 html 控制項的 value 取出,等後端處理完畢後,再放回 html 控制項中 !
整個清爽許多了 !!
這篇先到這裡,下一篇來看 複雜型別 object + collection !